<?php
/*
 * Classe Upload
 * Executa o upload de arquivos
 * @Author = Diego Henrique (diegoholiveira@yahoo.com.br)
 */
class Upload {

        private $file;          // Armazena o arquivo
        private $fileName;      // Armazena o novo nome do arquivo
        private $single;        // Armazena o tipo de upload
        private $arquivo;
        
        /*
         * Metodo construtor
         * @param $fieldName = Nome do campo que vai ser recebido
         */
        public function __construct( $fieldName ) {
                
                // Verifica se existe mais de um arquivo
                $i = 0;
                
                // Verifica se o upload é multiplo
                if (isset($_FILES[$fieldName]['name']) && is_array($_FILES[$fieldName]['name'])) {
                        
                        $this->single = false;
                        
                        while (isset($_FILES[$fieldName]['error'][$i]) && $_FILES[$fieldName]['error'][$i] == UPLOAD_ERR_OK) {
                                
                                $tmp_file[$i]['name']           = $_FILES[$fieldName]['name'][$i];
                                $tmp_file[$i]['type']           = $_FILES[$fieldName]['type'][$i];
                                $tmp_file[$i]['error']          = $_FILES[$fieldName]['error'][$i];
                                $tmp_file[$i]['size']           = $_FILES[$fieldName]['size'][$i];
                                $tmp_file[$i]['tmp_name']       = $_FILES[$fieldName]['tmp_name'][$i];
                                
                                $tmp_names[$i]  = $this->cleanFileName($tmp_file[$i]['name']);
                                
                                $this->file     = $tmp_file;
                                $this->fileName = $tmp_names;
                                
                                $i++;
                        }
                        
                }
                else if (isset($_FILES[$fieldName]['name']) && is_string($_FILES[$fieldName]['name'])) {
                        
                        $this->single = true;
                        
                        // Verifica se o arquivo passado é valido
                        if ( $_FILES[$fieldName]['error'] == UPLOAD_ERR_OK ) {

                                $this->file             = $_FILES[$fieldName];
                                $this->fileName = $this->cleanFileName($this->file['name']);

                        }

                }

        }
        
        /*
         * Metodo cleanFileName
         * Remove acentos, espaços e caracteres especiais
         * @param $string = string a ser limpa
         */
        private function cleanFileName( $string ) {
                
                // Converte todos os caracteres para minusculo
                $string = strtolower($string);

                // Remove os acentos
                $string = eregi_replace('[aáàãâä]', 'a', $string);
                $string = eregi_replace('[eéèêë]', 'e', $string);
                $string = eregi_replace('[iíìîï]', 'i', $string);
                $string = eregi_replace('[oóòõôö]', 'o', $string);
                $string = eregi_replace('[uúùûü]', 'u', $string);
                
                // Remove o cedilha e o ñ
                $string = eregi_replace('[ç]', 'c', $string);
                $string = eregi_replace('[ñ]', 'n', $string);
                
                // Substitui os espaços em brancos por underline
                $string = eregi_replace('( )', '_', $string);
                
                // Remove hifens duplos
                $string = eregi_replace('--', '_', $string);
                
                return $string;
                
        }
        
        /*
         * Metodo upload
         * Executa o upload
         * @param $path = caminho onde será salvo o arquivo
         * @param $replace = indica se o arquivo pode substituir
         * outro arquivo com o mesmo nome
         */
        public function upload( $path, $replace = false, $forn ) {

                //Pega o nome do Arquivo
                $nome = $this->fileName;
                if(isset($nome))
                {
               // echo $nome.'<br>';

                //echo md5(uniqid(time())) . strrchr($nome, ".");
                $this->arquivo = md5(uniqid(time())) . strrchr($nome, ".");

                
                    //exit;
               

                
               
                // Seta o limite de execução em zero para evitar erros
                set_time_limit(0);
                
                // Verifica se o diretorio passado como parametro existe
                if (!is_dir($path)) {
                        @mkdir( $path );
                }
                
                if ($this->single) {
                        
                        // Verifica se é para substituir o arquivo
                        if (!$replace) {
                        
                                // verifica se é o arquivo existe
                                if ( file_exists( sprintf("%s/%s", $path, $this->fileName) )  ) {
                                        return "O arquivo já existe na pasta indicada!";
                                }
                                
                        }
                        
                        if (move_uploaded_file( $this->file['tmp_name'], sprintf( "%s/%s", $path, $this->arquivo ) )) {

                            return true;
                        }
                        else {
                                return "Erro ao fazer o upload do arquivo!";
                        }
                         }
                        
                }
                else {
                        
                        // Armazena os erros
                        $erros = array();
                        
                        // Verifica se é para substituir o arquivo
                        if (!$replace) {
                                
                                for ($i = 0; $i < count($this->file); $i++) {
                                        
                                        // verifica se é o arquivo existe
                                        if ( file_exists( sprintf("%s/%s", $path, $this->fileName[$i]) )  ) {
                                                 $erros[] = sprintf(
                                                        "O arquivo %s já existe na pasta indicada!",
                                                        $this->fileName[$i]
                                                 );
                                        }
                                        
                                }
                                
                                if (count($erros)) return $erros;
                                
                        }
                        
                        for ($i = 0; $i < count($this->file); $i++) {
                                
                                if (!move_uploaded_file( $this->file[$i]['tmp_name'], sprintf( "%s/%s", $path, $this->fileName[$i] ) )) {
                                        $erros[] = sprintf(
                                                "Erro ao fazer o upload do arquivo %s!",
                                                $this->fileName[$i]
                                        );
                                }

                        }

                        if (count($erros)) return $erros;
                        else return true;

                }

        }
        
        /*
         * Metodo getFileName
         * Retorna o nome do arquivo em upload simples
         * Retorna um vetor com os nomes dos arquivos em uploads multiplo
         */
        public function getFileName() {
                return $this->fileName;
        }

         public function getNome() {
                return $this->arquivo;
        }
        /*
         * Metodo getExtension
         * Retorna a extensão do arquivo
         * Este metodo só funciona em uploads simples
         */
        public function getExtension() {
                if ($this->single) return strrchr( $this->fileName, "." );
                else return false;
        }

}